package com.coursehub.exercise.service;

import com.coursehub.exercise.dto.ExerciseCreateDto;
import com.coursehub.exercise.dto.ExerciseUpdateDto;
import com.coursehub.exercise.entity.Exercise;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 练习服务接口
 */
public interface ExerciseService {
    
    /**
     * 创建练习
     */
    Exercise createExercise(ExerciseCreateDto createDto);
    
    /**
     * 根据ID获取练习
     */
    Optional<Exercise> getExerciseById(String exerciseId);
    
    /**
     * 获取所有练习
     */
    List<Exercise> getAllExercises();
    
    /**
     * 分页获取练习
     */
    Page<Exercise> getExercises(Pageable pageable);
    
    /**
     * 更新练习
     */
    Exercise updateExercise(String exerciseId, ExerciseUpdateDto updateDto);
    
    /**
     * 删除练习
     */
    void deleteExercise(String exerciseId);
    
    /**
     * 根据练习名称模糊查询
     */
    List<Exercise> searchExercisesByName(String exerciseName);
    
    /**
     * 根据班级ID查找练习
     */
    List<Exercise> getExercisesByClassId(String classesId);
    
    /**
     * 根据班级ID查找进行中的练习
     */
    List<Exercise> getActiveExercisesByClassId(String classesId);
    
    /**
     * 根据班级ID查找已结束的练习
     */
    List<Exercise> getFinishedExercisesByClassId(String classesId);
    
    /**
     * 根据班级ID查找未开始的练习
     */
    List<Exercise> getUpcomingExercisesByClassId(String classesId);
    
    /**
     * 检查练习是否存在（通过ID）
     */
    boolean existsById(String exerciseId);
    
    /**
     * 检查练习是否存在（通过名称）
     */
    boolean existsByName(String exerciseName);
    
    /**
     * 根据多个条件查询练习
     */
    List<Exercise> searchExercises(String exerciseName, String classesId, Boolean isMultipleSubmission);
    
    /**
     * 验证班级是否存在（调用课程服务）
     */
    boolean validateClassExists(String classesId);
    
    /**
     * 验证班级权限（仅验证班级是否存在）
     */
    boolean validateClassPermission(String classesId);
    
    /**
     * 验证用户对班级的权限
     */
    boolean validateClassPermission(String classesId, String userId);
    
    /**
     * 获取课程的所有练习
     */
    List<Exercise> getAllCourseExercises(String courseId);
    
    /**
     * 获取用户在课程中的未完成练习
     */
    List<Exercise> getUnfinishedExercises(String userId, String courseId);
    
    /**
     * 获取用户在课程中的已完成练习
     */
    List<Exercise> getFinishedExercises(String userId, String courseId);
    
    /**
     * 获取练习详情
     */
    Map<String, Object> getExerciseDetail(String exerciseId, String userId);
    
    /**
     * 获取练习的所有题目
     */
    List<Map<String, Object>> getExerciseQuestions(String exerciseId);
    
    /**
     * 提交练习答案
     */
    Object submitExercise(Object submissionRequest);
    
    /**
     * 获取练习的所有学生记录
     */
    List<Map<String, Object>> getAllStudentExercise(String exerciseId);
    
    /**
     * 获取学生答案
     */
    List<Map<String, Object>> getAllStudentQuestionAnswer(String exerciseId, String userId);
    
    /**
     * 获取班级待批改的练习列表
     */
    List<Map<String, Object>> getClassExercisesForGrading(String classId);
    
    /**
     * 获取学生练习详情用于批改
     */
    Object getStudentExerciseForGrading(String exerciseId, String userId);
    
    /**
     * 提交批改结果
     */
    Object submitGrades(Object gradeSubmission);
    
    /**
     * 级联删除练习及相关数据
     */
    void cascadeDeleteExercise(String exerciseId);

    /**
     * 计算学生在练习中的排名（按得分降序，分数相同并列）
     */
    int calculateStudentRank(String exerciseId, String userId);
    
    /**
     * 加载课程题库
     */
    List<Map<String, Object>> loadCourseQuestions(String courseId);
    
    /**
     * 添加题目到题库
     */
    Object addQuestionToBank(String courseId, Object questionData);
    
    /**
     * 从题库删除题目
     */
    void deleteQuestionFromBank(String courseId, String questionId);
    
    /**
     * 根据课程和用户获取班级ID
     */
    String getClassesIdByCourseAndUser(String courseId, String userId);
    
    /**
     * 获取教师的班级列表
     */
    List<Map<String, Object>> getClassesAsTeacher(String courseId, String userId);
    
    /**
     * 获取用户在课程中的角色
     */
    String getUserRole(String courseId, String userId);
    
    /**
     * 添加题目到练习
     * @param exerciseId 练习ID
     * @param questionId 题目ID
     */
    void addQuestionToExercise(String exerciseId, String questionId);
}